﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Moore
{
    class Program
    {
        static void Main(string[] args)
        {
            Plansza planszaZJedzeniem = new Plansza();
            Plansza planszaZGraczami = new Plansza();
            List<TablicaPrzejsc> tablicaPrzejsc = new List<TablicaPrzejsc>();
            List<Gracz> gracze = new List<Gracz>(6);
            Algorytm algo = new Algorytm();
            algo.initPlanszaZJedzeniem(planszaZJedzeniem);
            algo.initGraczy(gracze, planszaZGraczami);
            int id = 0, nrPrzejscia = 1;
            // Rysowanie planszy
            showJedzenie(planszaZJedzeniem);

            // Rysowanie graczy
            showPeople(gracze);
            while (gracze.Count() > 0)
            {
                // Jesli id przekroczylo ilosc graczy zacznij od poczatku
                if (id == gracze.Count())
                {
                    Console.WriteLine("\n------------Przejście numer " + nrPrzejscia + " ------------");
                    nrPrzejscia++;
                    // Rysowanie planszy
                    showJedzenie(planszaZJedzeniem);

                    // Rysowanie graczy
                    showPeople(gracze);
                    // Rysowanie funkcji przejsc
                    showTablicaPrzejscia(tablicaPrzejsc);
                    tablicaPrzejsc.Clear();
                    id = 0;
                };
                // Pobierz stan do wykonania
                TablicaPrzejsc tablica = new TablicaPrzejsc();
                tablica.gracz = gracze[id];
                tablica.biezacyStan = gracze[id].Stan;
                var stanKoncowy = algo.funkcjaPrzejscia(id, gracze, planszaZJedzeniem, tablica);
                tablica.nowyStan = stanKoncowy;
                switch (stanKoncowy)
                {
                    case STANY.PATROL:
                        algo.patrol(id, gracze);
                        updatePlansza(id, gracze, planszaZGraczami);
                        gracze[id].IloscZyc -= 300;
                        break;
                    case STANY.ROZMOWA:
                        algo.rozmowa(id, gracze);
                        updatePlansza(id, gracze, planszaZGraczami);
                        gracze[id].IloscZyc -= 300;
                        break;
                    case STANY.JEDZENIE:
                        algo.jedzenie(id, gracze, planszaZJedzeniem);
                        updatePlansza(id, gracze, planszaZGraczami);
                        gracze[id].IloscZyc -= 300;
                        break;
                    case STANY.POSZUKIWANIE:
                        algo.poszukiwanie(id, gracze);
                        updatePlansza(id, gracze, planszaZGraczami);
                        gracze[id].IloscZyc -= 300;
                        break;
                    case STANY.SMIERC:
                        {
                            algo.smierc(id, gracze);
                            id--;
                        }
                        break;
                }
                tablicaPrzejsc.Add(tablica);
                id++;
            }
            Console.WriteLine("Koniec gry \nPress any key...");
            Console.Read();

        }

        private static void updatePlansza(int id, List<Gracz> gracze, Plansza planszaZGraczami)
        {
            planszaZGraczami.PlanszaArray.ForEach(list => list.ForEach(item => item = 0));
            foreach (Gracz item in gracze)
            {
                planszaZGraczami.PlanszaArray[item.X][item.Y] = item.Nazwa;
            }
        }

        private static void showTablicaPrzejscia(List<TablicaPrzejsc> tablicaPrzejsc)
        {
            Console.WriteLine("\nRysuje Tablice przejscia");
            foreach (TablicaPrzejsc item in tablicaPrzejsc)
            {
                Console.WriteLine("\n Gracz " + item.gracz.Nazwa);
                Console.WriteLine("Zyc: " + item.gracz.IloscZyc + " x: " + item.gracz.Y + " y: " + item.gracz.X);
                Console.Write(" ( " + item.biezacyStan);
                foreach (SymbolWejsciowy symbol in item.symbol)
                {
                    Console.Write("," + symbol);
                }

                Console.Write(" ) -->" + "(" + item.nowyStan + ")");
            }
            Console.WriteLine("\nPress any key...");
            Console.Read();
        }


        private static void showJedzenie(Plansza planszaZJedzeniem)
        {
            Console.WriteLine("\nRysuje plansze");
            for (int i = 0; i < planszaZJedzeniem.PlanszaArray.Count(); i++)
            {
                Console.WriteLine();
                for (int j = 0; j < planszaZJedzeniem.PlanszaArray.Count(); j++)
                {
                    Console.Write("{0,5:D}", planszaZJedzeniem.PlanszaArray[i][j]);
                }
            }
        }
        private static void showPeople(List<Gracz> gracze)
        {
            Plansza tmpPlansza = new Plansza();
            foreach (Gracz item in gracze)
            {
                tmpPlansza.PlanszaArray[item.X][item.Y] = item.Nazwa;
            }
            Console.WriteLine("\nRysuje graczy");
            for (int i = 0; i < tmpPlansza.PlanszaArray.Count(); i++)
            {
                Console.WriteLine();
                for (int j = 0; j < tmpPlansza.PlanszaArray.Count(); j++)
                {
                    Console.Write("{0,5:D}", tmpPlansza.PlanszaArray[i][j]);
                }
            }
        }
    }
}
